perm filename METER[SS,SYS] blob sn#729207 filedate 1983-11-01 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00008 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		TITLE	METER - USER MODE METER READOUT
C00009 00003	A B C D W X Y Z P PDLEN MTRMAX PDLIST MTRBUF MTRAVG CONST TABSPC MTRCOD MTRJOB MTRNSC MTRBKG SPCTAB MTRDS2 MTRDS3 MTRDTN MTRDSK MTRDS1 SPCLN NSPEC SPCNAM CNTRS
C00011 00004	GO GOLOOP GOSKIP GOEND GOAUTO QLOOP INLOOP NOTDIG INLUP1 HUH RESUMA RESUMB MTRST CODCSH USRCSH SYSCSH ANYCSH MTRBAD
C00016 00005	PEEKIT LOOP0 LOOP LOOP1 PKDONE NOMLST
C00018 00006	HITPNT JOBMTR BADJN
C00020 00007	MTRPN0 MTRPNT PLOOP0 PLOOP NLOOP PLOOP2 PLOOP1 CRLF DONALL SPCL1 MS1LUP MS1DON SPCXCT SPCXT1 SPCXT2 SPCXT0 CPOPJ1
C00028 00008	DECIN DECIN1 OCTOUT OCTOU1 DECOUT FRACT STAR NTAB NTABLN MS1MSG MS1LEN BADLST
C00032 ENDMK
C⊗;
	TITLE	METER - USER MODE METER READOUT

COMMENT ⊗

The data structure is:
mtrlst:	pointer to head of list of meter blocks
mtrptr:	pointer to current meter block
a meter block looks like:
MTRLNK:	link		(1 word) to next meter block.  zero for end of list.
				left half is stored in MTRCNM.
MTRDAT:	datum		(1 word) for BLKO MTR, i.e., the thing to measure
MTRVAL:	last val	(2 words) last BLKI MTR for standard period
MTRTOT:	cumulative val	(2 words) sum of all previous BLKI MTRs for this block
MTRCNT:	val count	(1 word)  number of previous values
MTRREC:	recent past	(2 words) total of some 64 recent samples
MTRTMP:	more recent 	(2 words) accumulates 64 samples for MTRREC
MTRNUT:	# of MTRONs	(1 word)  counted each time SETUS1 is done (total)
MTRNUR:	# of MTRONs	(1 word)  counted each time SETUS1 is done (recent)
MTRNUP:	# of MTRONs	(1 word)  counted each time SETUS1 is done (temp recent)
MTRNUL:	# of MTRONs	(1 word)  counted each time SETUS1 is done (last)

The reason the list is linked is because someday a UUO will allow meter requests
to be added to the list.  New meter blocks in free storage could be added.

⊗


MTRLNK←←0		;SPECIAL,,LINK TO NEXT
MTRDAT←←1		;BLKO TYPE
MTRVAL←←2		;1 RECENT VALUE
MTRTOT←←4		;CUMULATIVE
MTRCNT←←6		;COUNT OF NUMBER OF VALUES IN CUMULATIVE TOTAL
MTRREC←←7		;16 RECENT VALUES
MTRTMP←←11		;TEMPORARY CELLS
MTRNUT←←13
MTRNUR←←14
MTRNUP←←15
MTRNUL←←16
MTRSIZ←←17		;SIZE OF A METER BLOCK

;TYPES OF THINGS METERED BY MICROCODE STATE 1
MTRSWP←←1		;TIME SPENT WAITING FOR CACHE SWEEP
MTRSHF←←2		;TIME SPENT SHUFFLING /  SHUFFLING SETUP
MTRWST←←3		;wasted time
MTRCST←←4		;"CSHSET" TIME
MTRMAP←←5		;"APRMAP" TIME
MTRNXT←←6		;SCHEDULES
MTRPWT←←7		;TIME DURING PWAIT
MTRXWT←←10		;TIME DURING XWAIT
MTRWSC←←11		;TIME DURING WSCHED
MTRSPR←←12		;SPARE

;METER UUO
;AC BITS 0-8		FUNCTION
;IFE FTMTRACT,<
;   0			RESTORE METER BACKGROUND MODE
;   1			READ METERS INTO USER CORE AT ADDRESS POINTED TO
;			 BY RH OF AC.  FOUR DOUBLE WORDS ARE READ:
;			 0-1: TIMEBASE, 2-3: PERF COUNTER
;			 4-5: EBOX COUNTER, 6-7: MBOX COUNTER
;   2			METER SYSTEMWIDE CACHE HIT RATIO
;   3			METER USER MODE CACHE HIT RATIO (ALL USERS)
;   4			METER USER MODE CACHE HIT RATIO (ONE JOB ONLY)
;			 LOW 9 BITS OF AC ARE JOB NUMBER.  THIS FUNCTION
;			 ALSO CLEARS COUNT OF SCHEDULES KEPT IN MTRLST-12
;   5			ENTER METER "CODE" MODE.  METER CACHE HIT RATE BETWEEN
;			 ASSEMBLED IN MARKERS INSIDE THE SYSTEM.  LOW 3 BITS ARE
;			 THE PI CHANNEL NUMBER TO METER.  NOT ALL CHANNELS ARE
;			 IMPLEMENTED
;   6			RESET CUMULATIVE VALUES FOR ALL METER BLOCKS
;
;OPERATIONS FROM 2 UP TAKE THE METER OUT OF BACKGROUND MODE
;
;>;IFE FTMTRACT
;IFN FTMTRACT,<
;   0			RESTORE ACCOUNTING MODE METERING
;   1			READ METERS INTO USER CORE AT ADDRESS POINTED TO
;			 BY RH OF AC.  FOUR DOUBLE WORDS ARE READ:
;			 0-1: TIMEBASE, 2-3: PERF COUNTER
;			 4-5: EBOX COUNTER, 6-7: MBOX COUNTER
;   2			METER SYSTEMWIDE CACHE HIT RATIO
;   3			METER USER MODE CACHE HIT RATIO (ALL USERS)
;   4			RESET CUMULATIVE VALUES FOR ALL METER BLOCKS
;   5			ENTER BACKGROUND MODE METERING
;>;IFN FTMTRACT
;A B C D W X Y Z P PDLEN MTRMAX PDLIST MTRBUF MTRAVG CONST TABSPC MTRCOD MTRJOB MTRNSC MTRBKG SPCTAB MTRDS2 MTRDS3 MTRDTN MTRDSK MTRDS1 SPCLN NSPEC SPCNAM CNTRS

A←1
B←2
C←3
D←4
W←5
X←6
Y←7
Z←10

P←17
PDLEN←←100


MTRMAX←←100
PDLIST:	BLOCK PDLEN
MTRBUF:	BLOCK MTRSIZ*MTRMAX+1+MTRDAT
MTRAVG:	BLOCK 2
CONST:	0↔=100000

TABSPC:
MTRCOD:	0			;METER IS IN "CODE" MODE	MTRLST-14
MTRJOB:	0			;JOB TO METER			MTRLST-13
MTRNSC:	0			;NUMBER OF SCHEDULES OF MTRJOB	MTRLST-12
MTRBKG:	0			;METER IN BACKGROUND MODE	MTRLST-11
SPCTAB:
MTRDS2:	0			;MAX D2INT TIME			MTRLST-10
MTRDS3:	0			;D2X CORRESPONDING		MTRLST-7
MTRDTN:	BLOCK 2			;TEMP CELLS FOR D2INT=TIMEBASE	MTRLST-6
MTRDSK:	BLOCK 2			;CUMULATIVE D2INT TIME		MTRLST-4
MTRDS1:	BLOCK 2			;1 SAMPLE OF D2INT TIME		MTRLST-2
SPCLN←←<.-SPCTAB>/2
NSPEC←←.-TABSPC
SPCNAM:	[ASCIZ/		microseconds Max D2INT time.  D2X = /]
	[ASCIZ/Timebase/]
	[ASCIZ/D2INT total/]
	[ASCIZ/One D2INT sample/]

CNTRS:	BLOCK 2*4
;GO GOLOOP GOSKIP GOEND GOAUTO QLOOP INLOOP NOTDIG INLUP1 HUH RESUMA RESUMB MTRST CODCSH USRCSH SYSCSH ANYCSH MTRBAD

GO:	RESET
	MOVE A,[RADIX50 0,FTMTRA]
;;	MOVE B,[RADIX50 0,WAITS] ;block name
	MOVEI B,0		;no block name
	MOVEI C,A
	.SYML C,
	 JRST 4,.
	MOVEM C,FTMTRA#
	MOVE A,[SIXBIT /METER/]
	NAMEIN A,
	 OUTSTR [ASCIZ /Someone else is using the meter program. Proceed with caution!
/]
	RESCAN		;RE-READ MONITOR COMMAND LINE
GOLOOP:	INCHSL A
	 JRST QLOOP	;NOTHING TO READ
	CAIE A,";"	;COMMAND COMES AFTER SEMICOLON
	JRST GOLOOP
GOSKIP:	INCHSL A
	 JRST QLOOP
	CAIE A," "	;IGNORE SPACES AND TABS AFTER SEMICOLON
	CAIN A,11
	JRST GOSKIP
	MOVE B,A	;THIS IS CMD CHAR, BUT MIGHT ALSO BE ACTIVATOR
GOEND:	ANDI B,177
	CAIE B,12	;SKIP TO ACTIVATOR
	CAIN B,175
	JRST GOAUTO
	INCHSL B	;SKIP STUFF AFTER COMMAND CHAR UP TO ACTIVATOR
	 JRST GOAUTO
	JRST GOEND

QLOOP:	OUTSTR [ASCIZ /TYPE ONE CHARACTER OPTION:
?    TYPE THIS LIST
X    EXIT
M    BACKGROUND METER PRINTOUT
0-9  BACKGROUND METER PRINTOUT FOR GIVEN PI CHANNEL (8=UUO, 9=USER)
F    (FAST) BACKGROUND METER PRINTOUT FOR PI CHANNELS, UUO LEVEL, AND USER MODE
R    RESET BACKGROUND COUNTERS
S    START SYSTEM-WIDE CACHE HIT RATE METERING
H    PRINT CACHE HIT RATE RESULTS
U    START USER-MODE CACHE HIT RATE METERING
/]
	SKIPE FTMTRA
	OUTSTR [ASCIZ /B:   ENTER BACKGROUND MODE (CAREFUL!)
A:   RESTORE ACCOUNTING MODE
/]
	SKIPN FTMTRA
	OUTSTR [ASCIZ /B:   RESUME BACKGROUND METERING
Cn:  ENTER METER CODE MODE FOR PI CHANNEL N (MEASURE APPROXIMATE CACHE HIT RATIO)
Jn:  METER CACHE HIT AND SCHEDULES FOR SINGLE JOB n (DECIMAL)
/]
INLOOP:	OUTSTR [ASCIZ /
*/]
	INCHRW A
GOAUTO:	MOVE P,[-PDLEN,,PDLIST-1]
	SETZM MQUICK#		;ASSUME TYPING OUT EVERYTHING
	SETZM MPIMIN#		;MIN INDEX TO TYPEOUT
	MOVEI B,-1
	MOVEM B,MPIMAX#		;MAX INDEX TO TYPEOUT
	PUSH P,A
	PUSHJ P,PEEKIT		;GET CURRENT METER VALUES
	POP P,A
	CAIL A,"a"
	CAILE A,"z"
	CAIA
	SUBI A,40
	CAIN A,"?"
	JRST QLOOP
	CAIN A,"X"
	EXIT
	CAIN A,"M"
	JRST MTRPNT
	CAIL A,"0"
	CAILE A,"9"
	JRST NOTDIG
	SUBI A,"0"
	HRRZM A,MPIMIN		;NUMBER OF PI CHANNEL TO REPORT
	HRRZM A,MPIMAX
	SETOM MQUICK
	JRST MTRPNT

NOTDIG:	CAIN A,"F"
	JRST MTRPN0		;SET FAST TYPEOUT FLAG AND DO M CMD
	CAIN A,"B"
	JRST RESUMB
	CAIN A,"R"
	JRST MTRST
	CAIN A,"S"
	JRST SYSCSH
	CAIN A,"H"
	JRST HITPNT
	CAIN A,"U"
	JRST USRCSH
	SKIPN FTMTRA
	JRST INLUP1
	CAIN A,"A"
	JRST RESUMA
	SKIPE FTMTRA
	JRST HUH
INLUP1:	CAIN A,"C"
	JRST CODCSH
	CAIN A,"J"
	JRST JOBMTR
HUH:	OUTSTR [ASCIZ /
??/]
	JRST INLOOP

RESUMA:	MOVEI A,0
	MTRUUO A,
	CAI
	CAI
	JRST INLOOP

RESUMB:	MOVEI A,0
	SKIPE FTMTRA
	MOVSI A,5000
	MTRUUO A,
	CAI
	CAI
	JRST INLOOP

MTRST:	MOVSI A,6000
	SKIPE FTMTRA
	MOVSI A,4000
	MTRUUO A,
	CAI
	CAI
	JRST INLOOP

CODCSH:	PUSHJ P,DECIN		;READ CHANNEL NUMBER INTO B
	HRLI B,5000
	MTRUUO B,
	JRST 4,.
	JRST [	OUTSTR [ASCIZ /CAN'T METER THAT CHANNEL YET
/]
		JRST INLOOP	]
	JRST INLOOP

USRCSH:	SKIPA A,[3000,,]
SYSCSH:	MOVSI A,2000
ANYCSH:	MTRUUO A,
	JRST 4,.
	JRST MTRBAD
	JRST INLOOP

MTRBAD:	OUTSTR [ASCIZ /BAD METER ARGUMENTS
/]
	JRST 4,.
;PEEKIT LOOP0 LOOP LOOP1 PKDONE NOMLST

PEEKIT:	MOVSI A,377000
	SETPR2 A,
	JRST 4,.
	MOVE A,400325			;GET MTRLST
	JUMPE A,NOMLST			;NO METER LIST
	MOVEI B,-NSPEC(A)
	HRLI B,-NSPEC
LOOP0:	MOVE D,400000(B)
	HLRO C,B
	MOVEM D,TABSPC+NSPEC(C)
	AOBJN B,LOOP0
	MOVSI B,-MTRMAX			;NUMBER OF ENTRIES WE CAN STAND
LOOP:	MOVSI C,-MTRSIZ
	HRRI C,MTRBUF(B)		;BASE OF CURRENT METER BLOCK
LOOP1:	HLRO D,C			;-COUNT OF METER ENTRIES
	ADDI D,MTRSIZ(A)
	MOVE D,400000(D)
	MOVEM D,(C)
	AOBJN C,LOOP1
	HRRZ A,MTRBUF+MTRLNK(B)		;LINK TO NEXT BLOCK
	ADD B,[1,,MTRSIZ]
	JUMPE A,PKDONE
	JUMPL B,LOOP
	OUTSTR [ASCIZ/Too many meter blocks in the system.
Recompile this program with a larger MTRMAX.  Will continue.
/]
PKDONE:	SETZM MTRBUF+MTRDAT(B)		;ZERO TO TERMINATE LIST.
	DETSEG				;FLUSH SETPR2
	POPJ P,

NOMLST:	OUTSTR	[ASCIZ/No meter list
/]
	EXIT
;HITPNT JOBMTR BADJN

HITPNT:	SKIPE MTRBKG		;MAKE SURE METER ISN'T IN BACKGROUND MODE
	JRST [	OUTSTR [ASCIZ /
SORRY, METER IS IN BACKGROUND MODE.  ENABLE CACHE HIT METERING FIRST.
/]
		JRST INLOOP	]
	MOVE A,[1000,,CNTRS]	;READ BACK ALL DOUBLEWORD METERS
	MTRUUO A,
	JRST 4,.
	JRST MTRBAD
	OUTCHR [11]
	DMOVE W,CNTRS+2		;GET PERFORMANCE COUNTER
	ASHC W,-=12
	DMUL W,[0 ↔ =10000]
	DMOVE A,CNTRS+6		;MBOX COUNTER
	ASHC A,-=12
	DDIV W,A		;DIVIDE BY MBOX COUNTER
	DMOVE Y,[0 ↔ =10000]
	DSUB Y,W		;SUBTRACT FROM 100 TO GET % CACHE HIT
	SKIPE Y
	JRST 4,.
	MOVE W,Z
	IDIVI W,=100
	MOVE A,W
	PUSHJ P,DECOUT
	OUTCHR ["."]
	IDIVI X,=10
	MOVE A,X
	PUSHJ P,DECOUT
	MOVE A,Y
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ /% CACHE HIT RATE
/]
	SKIPN A,MTRJOB
	JRST INLOOP
	OUTSTR [ASCIZ /FOR JOB /]
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ /., # OF SCHEDULES = /]
	MOVE A,MTRNSC
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ /.
/]
	JRST INLOOP

JOBMTR:	PUSHJ P,DECIN		;READ JOB NUMBER INTO B
	JUMPE B,BADJN
	CAIL B,100
	JRST BADJN
	HRLI B,4000		;MAKE MTRUUO OP CODE
	MTRUUO B,		;SET UP ONE USER METERING AND ZERO SCHEDULE COUNT
	JRST 4,.
	JRST MTRBAD
	JRST INLOOP

BADJN:	OUTSTR [ASCIZ /
JOB NUMBER OUT OF RANGE/]
	JRST HUH
;MTRPN0 MTRPNT PLOOP0 PLOOP NLOOP PLOOP2 PLOOP1 CRLF DONALL SPCL1 MS1LUP MS1DON SPCXCT SPCXT1 SPCXT2 SPCXT0 CPOPJ1

MTRPN0:	MOVEI A,MFASTI			;MAX INDEX TO TYPEOUT IS USER MODE
	MOVEM A,MPIMAX
	SETOM MQUICK			;SUPPRESS LOTS OF STUFF
MTRPNT:	OUTSTR CRLF
	MOVE A,[1502,,777200]		;THIS IS SUPPOSED TO COUNT EVERYTHING
	CAME A,MTRBUF+MTRDAT		;AND IT SHOULD BE THE FIRST ENTRY
	JRST BADLST
	DMOVE A,MTRBUF+MTRTOT		;CUMULATIVE VALUE
	ASHC A,-=12			;12 BITS AT THE BOTTOM AREN'T COUNTED
	DIV A,MTRBUF+MTRCNT		;BY NUMBER OF SAMPLES= AVERAGE CLOCK RATE
	MOVEM A,MTRAVG+1		;AVERAGE RATE = 100%
	SETZM MTRAVG			;(HIGH WORD OF MTRAVG = 0)
	IMULI A,=120/4			;NUMBER OF MBOX CLOCKS/SECOND
	SKIPE MQUICK
	JRST PLOOP0			;ONLY WANT PI INFO TYPED OUT
	OUTSTR [ASCIZ/MBOX clock = /]
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ\/second

Most       Recent     Cumu-         Sample
recent     av 16      lative        Name
sample     samples	

\]

PLOOP0:	MOVEI B,MTRBUF
PLOOP:	ADDI B,MTRSIZ
	SKIPN A,MTRDAT(B)		;ANYONE HOME?
	JRST DONALL			;NO.
	CAMN A,[1102,,777200]		;MONITORING MICROCODE STATE 1?
	JRST PLOOP2			;YES.  DIFFERENT TABLE
	MOVSI C,-NTABLN
NLOOP:	CAMN A,NTAB(C)
	JRST PLOOP1			;FOUND THE NAME FOR THIS
	ADD C,[2,,2]
	JUMPL C,NLOOP
	JRST PLOOP1

PLOOP2:	HLRZ A,MTRLNK(B)		;GET THE INDEX TO THE TYPE OF METER CODE
	CAIL A,MS1LEN			;WITHIN BOUNDS?
	MOVEI A,0			;NO.  GIVE THE LOSE MESSAGE
	MOVEI C,MS1MSG-NTAB-1(A)	;FOR OUTSTR @NTAB+1(C)
ifn 1,<	jrst ploop >	;ignore microcode state 1 -- not used on KL10 model B
PLOOP1:	MOVEI W,(C)			;SEE IF ONLY WANTS SOME PI CHANNEL(S)
	LSH W,-1			;MULTIPLY BY TWO TO GET RIGHT INDEX
	CAML W,MPIMIN			;IN RANGE?
	CAMLE W,MPIMAX			;BELOW MAX CHANNEL?
	JRST PLOOP			;NO, SUPPRESS TYPEOUT
	DMOVE W,CONST
	DMUL W,MTRVAL(B)		;PRODUCT IN W,X,Y,Z
	DDIV W,MTRAVG			;X←0 TO 100000 (FOR 0 TO 1.0)
	ASH X,-=12
	PUSHJ P,FRACT			;WRITE FRACTION FROM X.
	DMOVE W,CONST
	DMUL W,MTRREC(B)		;recent 16 sample W,X,Y,Z
	DDIV W,MTRAVG
	ASHC W,-=16			;12 FOR 12 LOW BITS +4 FOR DIVIDE BY 16
	PUSHJ P,FRACT			;WRITE FRACTION FROM X.
	DMOVE W,CONST
	DMUL W,MTRTOT(B)		;CUMULATIVE PRODUCT IN W,X,Y,Z
	DDIV W,MTRAVG
	DIV W,MTRCNT(B)			;X←0 TO 100000 (FOR 0 TO 1.0)
	LSH W,-=12
	MOVE X,W
	PUSHJ P,FRACT
	OUTSTR [ASCIZ /    /]
	OUTSTR @NTAB+1(C)
	OUTSTR CRLF
	JRST PLOOP

CRLF:	BYTE(7)15,12

DONALL:
repeat 0,< ;no more microcode state 1 with model B KL-10, no more D2INT w/C1
	SKIPE MQUICK			;SUPPRESSING EXTRA STUFF?
	JRST INLOOP			;YUP, ALL DONE
	OUTSTR CRLF
	MOVSI D,-SPCLN
SPCL1:	MOVEI A,(D)
	LSH A,1
	DMOVE A,SPCTAB(A)
	XCT SPCXCT(D)
	OUTSTR @SPCNAM(D)
	OUTSTR CRLF
	AOBJN D,SPCL1

	OUTSTR [ASCIZ /
MICROCODE STATE 1 METERPOINT COUNTERS

Most	Last	Cumu-	Sample
recent	16	lative	Name
count	counts
/]
		
	MOVEI C,MTRBUF
MS1LUP:	ADDI C,MTRSIZ
	SKIPN A,MTRDAT(C)		;ANYONE HOME?
	JRST MS1DON			;NO.
	CAME A,[1102,,777200]		;MONITORING MICROCODE STATE 1?
	JRST MS1LUP			;NO.  SKIP IT
	MOVE A,MTRNUL(C)		;LAST COUNT
	PUSHJ P,DECOUT
	OUTCHR [11]
	MOVE A,MTRNUR(C)		;LAST 16 COUNTS
	PUSHJ P,DECOUT
	OUTCHR [11]
	MOVE A,MTRNUT(C)		;CUMULATIVE COUNTS
	PUSHJ P,DECOUT
	OUTCHR [11]
	HLRZ A,MTRLNK(C)
	CAIL A,MS1LEN			;WITHIN BOUNDS?
	MOVEI A,0			;NO.  GIVE THE LOSE MESSAGE
	OUTSTR @MS1MSG(A)
	OUTSTR CRLF
	DMOVE W,MTRVAL(C)		;GET TIME FROM LAST 4 TIC PERIOD
	ASHC W,-=12			;FLUSH IRRELEVANT BITS
	DMUL W,[0 ↔ 8]			;CONVERT TO MICROSECONDS
	DDIV W,[0 ↔ =100]
	DIV W,MTRNUL(C)			;DIVIDE BY NUMBER OF COUNTS
	MOVE A,W
	PUSHJ P,DECOUT			;USEC/EVENT
	OUTCHR [11]
	DMOVE W,MTRREC(C)		;GET TIME FROM LAST 16 4 TIC PERIODS
	ASHC W,-=12			;FLUSH IRRELEVANT BITS
	DMUL W,[0 ↔ 8]			;CONVERT TO MICROSECONDS
	DDIV W,[0 ↔ =100]
	DIV W,MTRNUR(C)			;DIVIDE BY NUMBER OF COUNTS
	MOVE A,W
	PUSHJ P,DECOUT			;USEC/EVENT
	OUTCHR [11]
	DMOVE W,MTRTOT(C)		;GET CUMULATIVE TIME
	ASHC W,-=12			;FLUSH IRRELEVANT BITS
	DMUL W,[0 ↔ 8]			;CONVERT TO MICROSECONDS
	DDIV W,[0 ↔ =100]
	DIV W,MTRNUT(C)			;DIVIDE BY NUMBER OF COUNTS
	MOVE A,W
	PUSHJ P,DECOUT			;USEC/EVENT
	OUTCHR [11]
	OUTSTR [ASCIZ \USEC/COUNT   \]
	MOVE W,MTRNUT(C)		;TOTAL NUMBER OF TIMES
	MOVE X,MTRCNT(C)		;TOTAL NUMBER OF 4 TIC PERIODS
	IMULI X,4*=50
	IDIVI X,3			;TOTAL TIME IN MS
	MOVE Y,X			;SAVE IT
	IMULI W,=1000
	IDIV W,X			;COUNTS PER SECOND
	MOVE A,W
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ \ COUNTS/SEC IN \]
	MOVE A,Y
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ \ MS

\]
	JRST MS1LUP

MS1DON:	OUTSTR [ASCIZ/
/]
>;repeat 0
	JRST INLOOP



SPCXCT:	PUSHJ P,SPCXT0
	PUSHJ P,SPCXT1		;PRINT CPU SECONDS
	PUSHJ P,SPCXT1
	PUSHJ P,SPCXT2

SPCXT1:	DIV A,[10000*=1000000]	;CONVERT TO SECONDS
	PUSHJ P,DECOUT		
	OUTSTR [ASCIZ/		CPU seconds  /]
	POPJ P,

SPCXT2:	DIV A,[10000]		;CONVERT TO MICROSECONDS
	PUSHJ P,DECOUT		
	OUTSTR [ASCIZ/		microseconds /]
	POPJ P,

SPCXT0:	PUSH P,B
	IDIVI A,10000
	PUSHJ P,DECOUT
	OUTSTR @SPCNAM(D)
	POP P,A			;ADDRESS
	PUSHJ P,OCTOUT
CPOPJ1:	AOS (P)
	POPJ P,
;DECIN DECIN1 OCTOUT OCTOU1 DECOUT FRACT STAR NTAB NTABLN MS1MSG MS1LEN BADLST

DECIN:	MOVEI B,0
DECIN1:	INCHWL A
	CAIN A,15
	JRST DECIN1
	CAIE A,175
	CAIN A,12
	POPJ P,
	CAIL A,"0"
	CAILE A,"9"
	JRST HUH
	IMULI B,=10
	ADDI B,-"0"(A)
	JRST DECIN1

OCTOUT:	MOVEI C,=12
	MOVE B,A
OCTOU1:	MOVEI A,0
	LSHC A,3
	ADDI A,"0"
	OUTCHR A
	SOJG C,OCTOU1
	POPJ P,


DECOUT:	IDIVI A,=10
	HRLM B,(P)
	SKIPE A
	PUSHJ P,DECOUT
	HLRZ A,(P)
	ADDI A,"0"
	OUTCHR A
	POPJ P,

FRACT:	JUMPL X,STAR
	CAILE X,=105000		;POSSIBLE 5% CONFUSION?
	JRST STAR
	PUSH P,B
	IDIVI X,=100000
	MOVE A,X
	PUSHJ P,DECOUT
	OUTCHR ["."]
	MOVE A,Y
	CAIGE A,=10000
	OUTCHR ["0"]
	CAIGE A,=1000
	OUTCHR ["0"]
	CAIGE A,=100
	OUTCHR ["0"]
	CAIGE A,=10
	OUTCHR ["0"]
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ/    /]
	POP P,B
	POPJ P,

STAR:	OUTSTR [ASCIZ/*******    /]
	POPJ P,


;PI channels must the be first 8 here to make the single channel typeout cmds work.
NTAB:	1502,,400200	↔	[ASCIZ/PI 0/]
	1502,,200200	↔	[ASCIZ/PI 1/]
	1502,,100200	↔	[ASCIZ/PI 2/]
	1502,,040200	↔	[ASCIZ/PI 3/]
	1502,,020200	↔	[ASCIZ/PI 4/]
	1502,,010200	↔	[ASCIZ/PI 5/]
	1502,,004200	↔	[ASCIZ/PI 6/]
	1502,,002000	↔	[ASCIZ/PI 7/]
	1502,,001000	↔	[ASCIZ/UUO level/]
	1502,,001400	↔	[ASCIZ/User mode/]
	    MFASTI←←<.-NTAB-2>/2  ;ABOVE IS LAST DATA FOR F CMD TYPEOUT
	1534,,777200	↔	[ASCIZ/EBOX time waiting for memory/]
	1554,,777200	↔	[ASCIZ/EBOX time waiting for cache miss/]
	1564,,777200	↔	[ASCIZ/EBOX waiting for EBOX induced writeback/]
	1570,,777200	↔	[ASCIZ/EBOX waiting for sweep writeback/]
NTABLN←←.-NTAB
	0		↔	[ASCIZ/Unknown meter point/]
MS1MSG:	[ASCIZ /Unknown Microcode state 1/]
	[ASCIZ /Waiting for sweep to finish/]
	[ASCIZ /Shuffle and shuffle setup/]
	[ASCIZ /Wasted time/]
	[ASCIZ /CSHSET routine/]
	[ASCIZ /APRMAP routine/]
	[ASCIZ /NXTJOB routine/]
	[ASCIZ /PWAIT routine/]
	[ASCIZ /XWAIT routine/]
	[ASCIZ /WSCHED routine/]
	[ASCIZ /spare  SPRON-SPROFF/]
MS1LEN←←.-MS1MSG


BADLST:	OUTSTR	[ASCIZ/Bad Meter list
/]
	EXIT

	END GO